import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import utils.DownLoadUtils;

import java.io.FileInputStream;
import java.io.IOException;
/*
* 分享:
* 1.超链接指向的资源可以解析，如果不能解析，则下载，可能会有提示框
* 需求:
* 任何资源都必须有下载提示框
* 知识点：使用响应头设置资源的打开方式
*       conten-disposition:attachment;filename=XXX
* 步骤:
* 1.定义页面,超链接href属性值应该是指向某一个servlet，传递一个资源名称1.png
* 2.使用字节流加载文件进内存
* 3.指定response的响应头 content-disposition:attachment
* */
@WebServlet("/downServlet")
public class DownlodeServle extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*根据参数获取值 获取文件名*/
        String filename = req.getParameter("filename");
    /*1.png 2.avi*/
        /*2.使用字节流输入流加载到内存*/
        ServletContext context = this.getServletContext();
        String realPath = context.getRealPath("/img/" + filename);
        /*指定response的响应头*/


        /*使用字节流*/
        FileInputStream fis=new FileInputStream(realPath);
        /*将输入流的数据写出到输入流*/
        /*
        *
        * 获取mime类型
        * mime：在互联网通信过程中定义的一种文件类型数据
        * html text/html
        * 格式 大类型/小类型 text/html
        * jpg jpeg image/jpeg
        *
        * */
        String mimeType = context.getMimeType(filename);
        System.out.println(filename+" "+mimeType);

        filename = DownLoadUtils.getFileName(req.getHeader("user-agent"), filename);
        /*设置响应头*/
        resp.setHeader("content-type",mimeType);
        /*设置响应头打开方式*/
        resp.setHeader("content-disposition","attachment;filename="+filename);
        ServletOutputStream sos = resp.getOutputStream();/*FileOutputStream*/

        /*定义一个缓冲区域*/
        byte[] buff=new byte[1024];
        int len=0;
        while((len=fis.read(buff))!=-1){
            sos.write(buff,0,len);/*从缓存去往外写,0到len这么长的长度*/
        }
        fis.close();
    }
}
